Retour à la page d’accueil

Dans cette partie du cours vous allez apprendre à réorganiser et changer la structure de tables dans R. Cela peur être utile si vous ne devez travailler que sur une partie des données. De plus ces changement sont parfois nécessaire pour mettre les données dans le format adapté au graphique que vous voulez réaliser.

Aujourd’hui nous allons voir: - Comment filtrer des lignes ou des colonnes dans un tableau - Ajouter ou modifier des colonnes - Combiner ces réorganisations avec des graphiques

Tout d’abord, créez un nouveau script R et préparez votre environnement de travail:

# Chargez la librairie `tidyverse` (aide: utilisez la fonction `library()`)

# Changez votre répertoire de travail pour être dans `session3_plots_reorganisation`
#(aide: utilisez la fonction `setwd()`)

# Importer `burghardt_et_al_2015_expt1.txt` et mettez le dans un objet appelé `expt1`
#(aide: utilisez la fonction `read_tsv()`)

Sélectionner des colonnes avec la fonction select()

Tout d’abord, utilisons les fonctions dim() et names() afin de connaitre les dimensions du tableau et le nom des colonnes.

dim(expt1)
## [1] 957  15
names(expt1)
##  [1] "genotype"             "background"           "temperature"         
##  [4] "fluctuation"          "day.length"           "vernalization"       
##  [7] "survival.bolt"        "bolt"                 "days.to.bolt"        
## [10] "days.to.flower"       "rosette.leaf.num"     "cauline.leaf.num"    
## [13] "blade.length.mm"      "total.leaf.length.mm" "blade.ratio"

Il y a beaucoup de colonnes dans ce tableau. Afin de ne garder que les colonnes genotype et temperature, nous pouvons utiliser la fonction select()

select(expt1, genotype, temperature)
## # A tibble: 957 x 2
##    genotype temperature
##    <chr>          <dbl>
##  1 Col Ama           12
##  2 Col Ama           12
##  3 Col Ama           12
##  4 Col Ama           12
##  5 Col Ama           12
##  6 Col Ama           12
##  7 Col Ama           12
##  8 Col Ama           12
##  9 Col Ama           12
## 10 Col Ama           12
## # … with 947 more rows

Il est aussi possible de ne garder que les colonnes qui contiennent le mot “bolt” dans leur nom:

select(expt1, contains("bolt"))
## # A tibble: 957 x 3
##    survival.bolt bolt  days.to.bolt
##    <chr>         <chr>        <dbl>
##  1 Y             Y               28
##  2 Y             Y               29
##  3 Y             Y               31
##  4 Y             Y               31
##  5 Y             Y               32
##  6 Y             Y               33
##  7 Y             Y               34
##  8 Y             Y               35
##  9 Y             Y               69
## 10 Y             Y               72
## # … with 947 more rows

Exercice : Sélectionnez les colonnes qui contiennent des données mesurées en mm

Sélectionner des lignes à partir de critères avec la fonction filter()

Avec la fonction filter(), nous pouvons garder toutes les lignes de notre table qui correspondent à des plantes qui ont subies une vernalisation.

Tout d’abord, nous devons connaitre les différentes valeurs de la colonne vernalization. Comme nous pouvons voir, il y a deux options: ‘NV’ et ‘V’.

unique(expt1$vernalization)
## [1] "NV" "V"

(note: $ permet de sélectionner une colonne en particulier de la table)

Comme nous voulons garder les plantes qui ont subies une vernalisation, nous devons filtrer les données pour garder les lignes pour lesquelles il y a “V” dans la colonne vernalization:

filter(expt1, vernalization == "V")
## # A tibble: 330 x 15
##    genotype background temperature fluctuation day.length vernalization
##    <chr>    <chr>            <dbl> <chr>            <dbl> <chr>        
##  1 Col Ama  Col                 12 Con                 16 V            
##  2 Col Ama  Col                 12 Con                 16 V            
##  3 Col Ama  Col                 12 Con                 16 V            
##  4 Col Ama  Col                 12 Con                 16 V            
##  5 Col Ama  Col                 12 Con                 16 V            
##  6 Col Ama  Col                 12 Con                 16 V            
##  7 Col Ama  Col                 12 Con                 16 V            
##  8 Col Ama  Col                 12 Con                 16 V            
##  9 Col Ama  Col                 12 Con                  8 V            
## 10 Col Ama  Col                 12 Con                  8 V            
## # … with 320 more rows, and 9 more variables: survival.bolt <chr>, bolt <chr>,
## #   days.to.bolt <dbl>, days.to.flower <dbl>, rosette.leaf.num <dbl>,
## #   cauline.leaf.num <dbl>, blade.length.mm <dbl>, total.leaf.length.mm <dbl>,
## #   blade.ratio <dbl>

Nous pouvons utiliser les opérateurs suivant pour définir les conditions pour filtrer les données:

Opérateur Condition de sélection Exemple
< inférieur à filter(expt1, days.to.bolt < 20)
<= inférieur ou égal à filter(expt1, days.to.bolt <= 20)
> supérieur à filter(expt1, days.to.bolt > 20)
>= supérieur ou égal à filter(expt1, days.to.bolt >= 20)
== égal à filter(expt1, days.to.bolt == 20)
!= différent de filter(expt1, days.to.bolt != 20)
%in% est contenu dans filter(expt1, genotype %in% c("Col FRI", "Ler-1"))

Il est aussi possible de combiner plusieurs conditions de sélection avec les opérateurs suivant:

Opérateur Signification Exemple
& ET filter(expt1, days.to.bolt == 20 & genotype == "Ler-1")
| OU filter(expt1, rosette.leaf.num < 8 | rosette.leaf.num > 100)

Nous pouvons aussi identifier les données manquantes (NA) avec la fonction is.na() ou sa négation (en utilisant !):

Opérateur Signification Exemple
is.na() données manquante filter(expt1, is.na(rosette.leaf.num))
!is.na() donnée non manquante filter(expt1, !is.na(rosette.leaf.num))

source de l’image

Par exemple, nous pouvons sélectionner les plantes qui ont été vernalisées ET qui ont poussées avec une température fluctuante:

filter(expt1, vernalization == "V" & fluctuation == "Var")

Il est aussi possible de sélectionner les plantes qui ont poussées avec 8h de jours OU qui fleurissent tardivement:

filter(expt1, day.length == "8" | days.to.bolt > 85)

Exercice: Filtrez les données pour garder les plantes selon les 3 cas de figures suivant:

  1. Plantes qui ne sont pas du background Ler et qui ont été traitées avec une température fluctuante.
  2. Plantes qui ont fleuries (bolt) en moins de 57 jours et qui ont moins de 40 feuilles
  3. Plantes du génotype fca-6 pour qui le blade.ratio n’est pas manquant

Combiner ces sélections avec un graphique

Afin de pouvoir combiner la sélection de données avec un graphique, nous devons d’abord apprendre à faire des chaines de commandes.

Créer des chaînes de commandes avec les pipes %>%

Les “pipes” (%>%) permettent de faire une séquence d’opération sur des données, sans avoir besoin de créer des objets intermédiaires (ou de faire des commandes imbriquées très compliquées)

Imaginons que nous voulions faire les sélections suivantes sur notre table:

  • Filtrer des données pour ne garder que les plantes qui ont été vernalisées

  • Ne garder que deux colonnes: le génotype et la taille totale des feuilles

Grace au symbole %>% pipe, nous pouvons créer une chaîne de commandes. Pour cela nous devons d’abord faire une commande et ajouter %>% à la fin de la ligne qui va utiliser le résultat de cette commande comme input pour la fonction à la ligne suivante. Voici comment faire:

expt1 %>% 
  filter(vernalization == "V") %>% 
  select(genotype, total.leaf.length.mm)
## # A tibble: 330 x 2
##    genotype total.leaf.length.mm
##    <chr>                   <dbl>
##  1 Col Ama                  22.1
##  2 Col Ama                  26.8
##  3 Col Ama                  27.9
##  4 Col Ama                  22.8
##  5 Col Ama                  24.9
##  6 Col Ama                  22.2
##  7 Col Ama                  24.1
##  8 Col Ama                  21.4
##  9 Col Ama                  36  
## 10 Col Ama                  29.9
## # … with 320 more rows

Exercice: Utilisez %>% pour faire les sélections suivantes surexpt1:

  • Gardez les plantes qui ne sont pas du background Ler, et qui ont été traitées avec la température fluctuante.
  • Ne gardez que les colonnes qui contiennent le génotype, la longueur de “blade” et des information sur le “bolting” (aide: utilisez contains())

Combiner avec un graphique

Avec le pipe nous pouvons aussi utiliser l’output d’une commande (ou d’une chaîne de commandes) comme un input pour ggplot afin de faire un graphique sur les données sélectionnées. Ceci est très utile lors de la phase d’exploration des données (sans avoir à créer de nouveaux objets avec en permanence <-).

Nous pouvons par exemple faire un box plot pour le temps de floraison en fonction de la fluctuation de température, mais celle fois uniquement pour les plantes qui ont été vernalisées:

expt1 %>% 
  filter(vernalization == "V") %>% 
  ggplot(aes(fluctuation, days.to.flower)) + 
  geom_boxplot()

Exercice: Faite un violon plot du temps de floraison pour les différents génotypes, mais uniquement pour les plantes ayant poussées en jours court (8h de jour).

Modifier ou ajouter des colonnes avec mutate()

La fonction mutate() permet d’ajouter de nouvelles vatiables (i.e. nouvelles colonnes) dans une table, ou de modifier des colonnes déjà existantes.

source de l’image

Par exemple, ajoutons une colonne leaf.length.cm qui va contenir la longueur des feuilles en cm. Pour cela nous devons créer une nouvelle colonne en utilisant la colonne leaf.length.mm qui existe dans la table.

# Créez une nouvelle table avec la colonne supplémentare  
expt1.cm <- mutate(expt1, total.leaf.length.cm = total.leaf.length.mm/10)

# Vérifier que la nouvelle colonne est bien là
colnames(expt1.cm)
##  [1] "genotype"             "background"           "temperature"         
##  [4] "fluctuation"          "day.length"           "vernalization"       
##  [7] "survival.bolt"        "bolt"                 "days.to.bolt"        
## [10] "days.to.flower"       "rosette.leaf.num"     "cauline.leaf.num"    
## [13] "blade.length.mm"      "total.leaf.length.mm" "blade.ratio"         
## [16] "total.leaf.length.cm"

Nous pouvons aussi créer et modifier plus d’une colonne à la fois, en les séparant pas une virgule (,) dans la fonction mutate():

# Créez deux nouvelles colonnes
expt1.cm <- mutate(expt1, 
                   blade.length.cm = blade.length.mm/10,
                   total.leaf.length.cm = total.leaf.length.mm/10)

# Vérifier que les nouvelles colonnes sont bien là
colnames(expt1.cm)
##  [1] "genotype"             "background"           "temperature"         
##  [4] "fluctuation"          "day.length"           "vernalization"       
##  [7] "survival.bolt"        "bolt"                 "days.to.bolt"        
## [10] "days.to.flower"       "rosette.leaf.num"     "cauline.leaf.num"    
## [13] "blade.length.mm"      "total.leaf.length.mm" "blade.ratio"         
## [16] "blade.length.cm"      "total.leaf.length.cm"

Attention!! Si vous utilisez le nom d’une colonne déjà existante, vous allez la modifier et non créer une nouvelle colonne.

Concatener ou séparer des colonnes avec unite() et separate()

Pour concantener deux ou plusieurs colonnes ensemble, utilisez la fonction unite(). Par exemple, pour concaténer vernalization, survival.bolt et bolt:

# Créez deux nouvelles colonnes
expt1.concatenated <- unite(expt1, "Vern_survival_bolt",vernalization,survival.bolt,bolt)

# Vérifier que la nouvelles colonnes sont bien là
colnames(expt1.concatenated)
##  [1] "genotype"             "background"           "temperature"         
##  [4] "fluctuation"          "day.length"           "Vern_survival_bolt"  
##  [7] "days.to.bolt"         "days.to.flower"       "rosette.leaf.num"    
## [10] "cauline.leaf.num"     "blade.length.mm"      "total.leaf.length.mm"
## [13] "blade.ratio"

A contrario, pour séparer une colonne en deux ou plusieurs colonnes, utilisez la fonction separate(). Par exemple, pour séparer la colonne barkground :

# Créez deux nouvelles colonnes
expt1.separated <- separate(expt1, background, into=c("genotype", "FRI mutation"))

# Vérifier que la nouvelles colonnes sont bien là
colnames(expt1.separated)
##  [1] "temperature"          "genotype"             "FRI mutation"        
##  [4] "fluctuation"          "day.length"           "vernalization"       
##  [7] "survival.bolt"        "bolt"                 "days.to.bolt"        
## [10] "days.to.flower"       "rosette.leaf.num"     "cauline.leaf.num"    
## [13] "blade.length.mm"      "total.leaf.length.mm" "blade.ratio"



Exercice:

Reproduisez cette figure de Burghard et al 2015

Aide:

  • Créez une nouvelle colonne avec le ratio de blade.length.mm et total.leaf.length.mm

  • Créez une nouvelle colonne (nommée par exemple condition) en concaténant day.length, temperature et fluctuation

  • Sélectionnez les background Col et Ler

  • Faites un boxplot du ratio de blade.length.mm et total.leaf.length.mm en fonction de la condition, en créant des facets en fonction du background

  • Pas besoin de mettre de la couleur qui n’apporte rien au graphique


A faire pour la prochaine séance

A partir ce ce que nous avons vu aujourd’hui:

  • Utilisez mutate, filter, select, unite ou separate pour réorganiser vos données. Est-ce que cela vous permet de faire de nouveaux graphiques qui n’étaient pas possibles sur les données non réorganisées?
  • N’oubliez pas d’utiliser des pipes (%>%) pour faire des chaines de commandes si vous utilisez plus d’une fonction sur vos données


Retour à la page d’accueil